﻿using System;
using System.Collections.Generic;

namespace Cine
{
    public class VentaService: IVentaService
    {
        public IVentaRepository VentaRepositorio { get; set; }

        private bool HayButacas(int butacas, Sesion sesion)
        {
            int butacasVendidas = VentaRepositorio.CalcularEntradasVendidasSesion(sesion.Id);
            Sala sala = sesion.Sala;
            int aforo = sala.NButacas;

            return (butacasVendidas + butacas <= aforo);
        }

        // 
        public double CalculaPrecio(int nEntradas, double precioEntrada)
        {
            double total=0;
            if (nEntradas > 5)
            {
                total = (precioEntrada * nEntradas) * 0.9;
            }
            else {
                total = precioEntrada * nEntradas;           
            }
            return total;
        }
        
        public Venta Create(Venta venta)
        {
            Sesion sesion = venta.Sesion;
            
            // Chequea que la sesión está abierta
            if (!sesion.Abierta)
                throw new SesionCerradaException(sesion.Id);

            // Chequea que hay suficientes entradas disponibles
            if (HayButacas(venta.NEntradas, sesion))
            {               
                venta.Precio = CalculaPrecio(venta.NEntradas, venta.PrecioEntrada);
                return VentaRepositorio.Create(venta);
            }
            else
            {
                throw new Exception();
            }
        }

        public Venta Read(long id)
        {
            return VentaRepositorio.Read(id);            
        }

        public IList<Venta> List()
        {
            return VentaRepositorio.List();
        }

        public IList<Venta> List(Sesion sesion)
        {
            return List(sesion.Id);            
        }

        public IList<Venta> List(long idSesion)
        {
            return VentaRepositorio.List(idSesion);
        }

        public Venta Update(Venta venta)
        {
            throw new NotImplementedException();
        }

        public void Delete(long id)
        {
            throw new NotImplementedException();
        }

        public double TotalDevolucionVenta(long idVenta)
        {
            Venta venta = VentaRepositorio.Read(idVenta);            
            Sesion sesion = venta.Sesion;

            if (!sesion.Abierta)
                throw new SesionCerradaException(sesion.Id);

            return VentaRepositorio.TotalDevolucionVenta(idVenta);
        }

        public double CalcularTotalVentas()
        {
            return VentaRepositorio.CalcularTotalVentas();
        }

        public double CalcularTotalVentasSesion(long idSesion)
        {
            return VentaRepositorio.CalcularTotalVentasSesion(idSesion);
        }

        public double CalcularTotalVentasSala(long idSala)
        {
            return VentaRepositorio.CalcularTotalVentasSala(idSala);
        }

        public int CalcularEntradasVendidas()
        {
            return VentaRepositorio.CalcularEntradasVendidas();
        }

        public int CalcularEntradasVendidasSesion(long idSesion)
        {
            return VentaRepositorio.CalcularEntradasVendidasSesion(idSesion);
        }

        public int CalcularEntradasVendidasSala(long idSala)
        {
            return VentaRepositorio.CalcularEntradasVendidasSala(idSala);
        }
    }
}
